www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/LTE_check_parameters.m

    % 检查参数组合配置是否满足要求 计算其他非独立参数
% 非独立运行脚本文件,请从LTE_main_gui_final 运行
%
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-06-20
%  ==========================================================

%其他原始输入检查见 LTE_load_parameter
load TransblockPar.mat % 载入可用的TB0矩阵配置


% 一个PRB内导频占用的资源粒子数
% 举例 rsNum(CFI,nTx)表示控制符号数为CFI,天线数为nTx时,
% 属于PDSCH的每个PRB内导频占用的个数,不存在3天线情况,此处全0
rsNum = [6 12 0 20;
         6 12 0 16;
         6 12 0 16];

% 每个资源块包含的子载波数
LTE_par.scPerRB = 12; 

% 根据CP类型确定OFDM符号数
if strcmp(LTE_par.cyclicPrefix,'normal')
   LTE_par.nOfdmSymb = 14; 
end
% 根据带宽确定CP以及FFT点数
if LTE_par.sysBand == 10000000
    LTE_par.RB_DL = 50;
    LTE_par.FFT_SIZE = 1024;
    LTE_par.CP = [80 72 72 72 72 72 72 80 72 72 72 72 72 72];
elseif LTE_par.sysBand == 20000000
    LTE_par.RB_DL = 100;
    LTE_par.FFT_SIZE = 2048;
    LTE_par.CP = [160 144 144 144 144 144 144 160 144 144 144 144 144 144];
end

% 根据用户数及每用户的PRB分配情况,检查是否超出系统带宽
applyPRB = 0;
for iUE = 1:LTE_par.nUE
    if LTE_par.UE_par.nRB(iUE) < 1
        errNum = errNum+1;
        errorMsg{errNum} = 'ERROR: 为用户分配总带宽不能为0或负数';
        errNum = errNum+1;
        errorMsg{errNum} = 'HINT:系统可用物理资源数 {20MHz带宽:100PRB 10MHz带宽:50PRB}';
    end
   applyPRB = applyPRB+LTE_par.UE_par.nRB(iUE); 
end
if applyPRB > LTE_par.RB_DL
    errNum = errNum+1;
    errorMsg{errNum} = 'ERROR: 为用户分配总带宽超过系统可用带宽';
    errNum = errNum+1;
    errorMsg{errNum} = 'HINT:用户数乘以物理资源数不大于系统可用物理资源数 {20MHz带宽:100PRB 10MHz带宽:50PRB}';
end

% 预处理 传输模式检查
preProcess = LTE_par.UE_par.preProcess;
if strcmp(preProcess,'singleAnt')
    if LTE_par.UE_par.transMod > 1 && LTE_par.UE_par.transMod < 7
        errNum = errNum+1;
        errorMsg{errNum} = 'ERROR: 预处理方式和传输模式不匹配';
        errNum = errNum+1;
        errorMsg{errNum} = 'HINT:修改传输模式为1或改变预处理方式 传输模式2对应预处理:Diversity 传输模式3-6对应预处理:Multiplex';
    end

elseif strcmp(preProcess,'spatialMultiplexing')
    if LTE_par.UE_par.transMod == 1 || LTE_par.UE_par.transMod == 2 || LTE_par.UE_par.transMod == 7
        errNum = errNum+1;
        errorMsg{errNum} = 'ERROR: 预处理方式和传输模式不匹配';
        errNum = errNum+1;
        errorMsg{errNum} = 'HINT:修改传输模式为3-6或改变预处理方式 传输模式1和7对应预处理:singleAnt 传输模式2对应预处理:Diversity';
    end
elseif strcmp(preProcess,'tranmitDiversity')
    if LTE_par.UE_par.transMod ~= 2
        errNum = errNum+1;
        errorMsg{errNum} = 'ERROR: 预处理方式和传输模式不匹配';
        errNum = errNum+1;
        errorMsg{errNum} = 'HINT:修改传输模式为2或改变预处理方式 传输模式1和7对应预处理:singleAnt 传输模式3-6对应预处理:Multiplex';
    end
end

% 预处理模式 码字数 层数 天线端口数检查
nTx = LTE_par.BS_par.nAnt;
if strcmp(preProcess,'singleAnt')
    
    for iUE = 1:LTE_par.nUE
        nCW = LTE_par.UE_par.nCW(iUE);
        nLayer = LTE_par.UE_par.nLayer(iUE);
        
        if nCW+nLayer+nTx ~= 3 % 三个参数有一个不为1(三个参数最小值为1)
            str = sprintf('ERROR:第 %d 个用户 码字数-层数-发端天线数 不匹配',iUE);
            errNum = errNum+1;
            errorMsg{errNum} = str;
            errNum = errNum+1;
            errorMsg{errNum} = 'HINT:码字数 层数 发端天线数在单天线下有效配置为{1-1-1}';
        end
    end

elseif strcmp(preProcess,'spatialMultiplexing')
    
    for iUE = 1:LTE_par.nUE
        nCW = LTE_par.UE_par.nCW(iUE);
        nLayer = LTE_par.UE_par.nLayer(iUE);
        PMI = LTE_par.UE_par.PMI(iUE);
        if LTE_par.BS_par.nAnt == 2
            if PMI < 0 || PMI > 3
                str = sprintf('ERROR:第 %d 个用户 PMI 配置错误',iUE);
                errNum = errNum+1;
                errorMsg{errNum} = str;
                errNum = errNum+1;
                errorMsg{errNum} = 'HINT:2Tx下 PMI为0-3';
            end
            
        elseif LTE_par.BS_par.nAnt == 4
            if PMI < 0 || PMI > 15
                str = sprintf('ERROR:第 %d 个用户 PMI 配置错误',iUE);
                errNum = errNum+1;
                errorMsg{errNum} = str;
                errNum = errNum+1;
                errorMsg{errNum} = 'HINT:4Tx下 PMI为0-15';
            end
        end
            
        
        
        if ( nCW == 1 && nLayer > 2) || ( nCW > nLayer) || (nLayer > nTx) || nTx == 1
            str = sprintf('ERROR:第 %d 个用户 码字数-层数-发端天线数 不匹配',iUE);
            errNum = errNum+1;
            errorMsg{errNum} = str;
            errNum = errNum+1;
            errorMsg{errNum} = 'HINT:复用下有效配置为{ 1-1-P 2-2-P 2-2-P 2-3-P 2-4-P | P大于2且大于等于第二个数}';
        end
        
        % CDD中的特例检查
        if LTE_par.UE_par.transMod == 3
            if nCW == 1 || nLayer == 1
                str = sprintf('ERROR:第 %d 个用户 CDD模式下码字数不能为1',iUE);
                errNum = errNum+1;
                errorMsg{errNum} = str;
                errNum = errNum+1;
                errorMsg{errNum} = 'HINT:CDD模式下码字数应为2';
            end
            
            if LTE_par.recEnalbe == true
               errNum = errNum+1;
               errorMsg{errNum} = 'ERROR:CDD模式仅实现发端,收端暂时未对其检测';
               errNum = errNum+1;
               errorMsg{errNum} = 'HINT:请选择其他模式,收端可实现';
               
            end
        end
        
        
            
        
        % MU-MIMO中的特例检查
        if LTE_par.UE_par.transMod == 5
            if LTE_par.nUE < 2
                errNum = errNum+1;
                errorMsg{errNum} = 'ERROR:MU-MIMO模式下,UE数小于2';
                errNum = errNum+1;
                errorMsg{errNum} = 'HINT:MU-MIMO模式下,UE数目不能小于2,UE1和UE2分配相同的子带';
            end
        end
        
    end
    
        
    
elseif strcmp(preProcess,'tranmitDiversity')

    for iUE = 1:LTE_par.nUE
        nCW = LTE_par.UE_par.nCW(iUE);
        nLayer = LTE_par.UE_par.nLayer(iUE);
        
        if ( nCW == 1 && nLayer == 1) || ( nCW == 1 && nLayer == 3) || ( nCW ~= 1 ) || (nLayer ~= nTx)
            str = sprintf('ERROR:第 %d 个用户 码字数-层数-发端天线数 不匹配',iUE);
            errNum = errNum+1;
            errorMsg{errNum} = str;
            errNum = errNum+1;
            errorMsg{errNum} = 'HINT:复用下有效配置为{ 1-2-P 1-4-4 | P大于等于第二个数}';
        end
    end
    
end

if strcmp(LTE_par.setpar,'loadPar')
% ================== % 载入参数模式下 参数检查部分 ===============
% 检查KMIMO
if LTE_par.UE_par.transMod == 3 || LTE_par.UE_par.transMod == 4
    if LTE_par.UE_par.KMIMO == 2;
        
    else
        errNum = errNum+1;
        errorMsg{errNum} = 'ERROR:KMIMO 取值不合法';
        errNum = errNum+1;
        errorMsg{errNum} = 'HINT:KMIMO在传输模式3或4下,取值为2。其他情况取值为1';
        
    end
else
    if LTE_par.UE_par.KMIMO == 1
        
    else
        errNum = errNum+1;
        errorMsg{errNum} = 'ERROR:KMIMO 取值不合法';
        errNum = errNum+1;
        errorMsg{errNum} = 'HINT:KMIMO在传输模式3或4下,取值为2。其他情况取值为1';
        
    end
end

%  检查TB是否和IMCS NRB对应 
nUE = LTE_par.nUE;
nRB = LTE_par.UE_par.nRB(1);
IMCS = LTE_par.UE_par.IMCS(1);
Qm = LTE_par.UE_par.Qm(1);

if IMCS<=9
    ITBS = IMCS;
    mary = 2;
elseif IMCS<=16
    ITBS = IMCS-1;
    mary = 4;
else
    ITBS = IMCS-2;
    mary = 6;
end

if mary ~= Qm
    str = sprintf('HINT:当IMCS为 %d 时,调制方式应取 %d {2:QPSK 4:16QAM 6:64QAM} 详细取值参见36.213 V8.7.0 section 7.1.7.2.1',IMCS,mary);
    errNum = errNum+1;
    errorMsg{errNum} = 'ERROR:调制方式选择错误';
    errNum = errNum+1;
    errorMsg{errNum} = str;
end
LTE_par.UE_par.ITBS(1,1) = ITBS; % 可能未用到该参数
sizeTB0 = transBlockSize(ITBS+1,nRB);
if sizeTB0 ~=LTE_par.UE_par.sizeTB(1)
    errNum = errNum+1;
    errorMsg{errNum} = 'ERROR:TB0 取值不合法';
    errNum = errNum+1;
    errorMsg{errNum} = 'HINT:TB0 取值参见36.213 V8.7.0 section 7.1.7.2.1';
end

elseif strcmp(LTE_par.setpar,'manuPar')
    % ================== % 手动配置参数模式下 参数检查 非独立参数确定 ===============
    % 根据传输模式确定 KMIMO
    if LTE_par.UE_par.transMod == 3 || LTE_par.UE_par.transMod == 4
        LTE_par.UE_par.KMIMO = 2;
    else
        LTE_par.UE_par.KMIMO = 1;
    end
    
    % 根据发端天线数,控制格式指示,确定资源粒子数
    % 根据调制编码序号,确定传输块大小,调制方式
    CFI = LTE_par.CFI;
    nTx = LTE_par.BS_par.nAnt;
    scPerRB = LTE_par.scPerRB;
    nOfdmSymb = LTE_par.nOfdmSymb;
    
    for iUE = 1:LTE_par.nUE
        nCW = LTE_par.UE_par.nCW(iUE);
        nLayer = LTE_par.UE_par.nLayer(iUE);
        nRB = LTE_par.UE_par.nRB(iUE);
        
        % nRE表示子带内每个天线上可用于PDSCH传输数据符号的个数
        LTE_par.UE_par.nRE(iUE) = nRB*((nOfdmSymb-CFI)*scPerRB-rsNum(CFI,nTx));
        
        % 码字0调制符号数 
        LTE_par.UE_par.M_0_SYMB(iUE) = nRB*((nOfdmSymb-CFI)*scPerRB-rsNum(CFI,nTx));
        if nCW == 2 && nLayer == 4
            LTE_par.UE_par.M_0_SYMB(iUE) = 2*nRB*((nOfdmSymb-CFI)*scPerRB-rsNum(CFI,nTx));
        end
        
        for iTB = 1:LTE_par.UE_par.nCW(iUE)
            
            IMCS = LTE_par.UE_par.IMCS(iTB,iUE);
            
            if IMCS<0 || IMCS > 28
                str = sprintf('ERROR:第 %d 个用户 IMCS超出范围',iUE);
                errNum = errNum+1;
                errorMsg{errNum} = str;
                errNum = errNum+1;
                errorMsg{errNum} = 'HINT:IMCS有效取值为0-28';
                
            else
                
                if IMCS<=9
                    ITBS = IMCS;
                    Qm = 2;
                elseif IMCS<=16
                    ITBS = IMCS-1;
                    Qm = 4;
                else
                    ITBS = IMCS-2;
                    Qm = 6;
                end
                sizeTB = transBlockSize(ITBS+1,nRB);
                LTE_par.UE_par.sizeTB(iTB,iUE) = sizeTB;
                LTE_par.UE_par.Qm(iTB,iUE) = Qm;
                
            end
        end
        
    end
     
end

% 参数错误统计
if errNum ~= 1
    str = sprintf('参数配置错误个数为: %d',(errNum-1)/2);
    errorMsg{1} = str;
    LTE_par.errFlag = true; % 参数配置错误
else
    LTE_par.errFlag = false; % 参数配置正确
end


% LTE_par.UE_par.decodeAlg = 1; % 解码算法 0:Log-Map算法 1:MAX-Log-Map算法 2:Sova算法
LTE_par.UE_par.niter = 8;               % turbo译码迭代次数
LTE_par.carrBand = 15000; % 每个子载波带宽

% LTE_par.addNoise = true;
% LTE_par.detecAlg = 'MMSE';